package contable.aplicacion.contabilidad.inventario;

import contable.aplicacion.contabilidad.ManejadorContable;
import contable.dominio.Cardex;
import contable.dominio.Cuenta;
import contable.dominio.Inventario;
import contable.dominio.Registro;
import java.util.Date;

/**
 *
 * @author jaime
 */
public abstract class Compras extends Inventarios {

    /**
     * Registrar la compra de artículos de escritorio
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>137-001-000-000</td>
     *     <td>ARTICULOS DE ESCRITORIO</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void articulosEscritorio(double valor) {
        registrarCompra("137-001-000-000", valor);
    }

    /**
     * Registrar la compra de materiales de producción
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>132-001-000-000</td>
     *     <td>MATERIALES DE PRODUCCION</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void materialProduccion(double valor) {
        registrarCompra("132-001-000-000", valor);
    }

    /**
     * Registrar la compra de equipo de oficina
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>121-003-000-000</td>
     *     <td>MUEBLES Y EQUIPO DE OFICINA</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void muebleEquipoOficina(double valor) {
        registrarCompra("121-003-000-000", valor);
    }

    /**
     * Registrar la compra de equipo de ventas
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>121-002-000-000</td>
     *     <td>MUEBLES Y EQUIPO DE VENTAS</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void muebleEquipoVentas(double valor) {
        registrarCompra("121-002-000-000", valor);
    }

    /**
     * Registrar la compra de repuestos y accesorios
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>136-001-000-000</td>
     *     <td>REPUESTOS Y ACCESORIOS</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void repuestosAccesorios(double valor) {
        registrarCompra("136-001-000-000", valor);
    }

    /**
     * Registrar la compra de mercaderías para su posterior venta
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>423-001-000-000</td>
     *     <td>MERCADERIAS</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     * @param valor El valor con que se afectará las cuentas
     */
    public void mercaderias(double valor) {
        registrarCompra("423-001-000-000", valor);
    }

    /**
     * Registrar el gasto por flete sobre compras
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>411-018-000-000</td>
     *     <td>FLETES Y TRANSPORTES</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     *   <tr>
     *     <td>111-000-000-000</td>
     *     <td>CAJA</td>
     *     <td></td>
     *     <td>valor</td>
     *   </tr>
     * </table>
     *
     * @param valor El valor con que se afectará las cuentas
     */
    public void flete(double valor) {
        Cuenta flete = new Cuenta();
        Cuenta caja = new Cuenta();
        fsql.rollback(flete, "411-018-000-000");
        fsql.rollback(caja, "111-000-000-000");
        flete.cargar(valor);
        caja.abonar(valor);
        fsql.commit(flete);
        fsql.commit(caja);
        registro = new Registro(new Date(), "Se registro el gasto por flete", valor, periodo, flete, caja);
        fsql.commit(registro);
    }

    @Override
    public void papelFotografico(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 0);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        materialProduccion(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void tinta(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 1);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        materialProduccion(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void empaque(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 2);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        materialProduccion(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void fotografia(int cantidad, double precio) {
    }

    @Override
    public void camara(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 4);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void memoriaUSB2(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 5);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void memoriaUSB4(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 6);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void memoriaUSB8(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 7);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void memoriaUSB16(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 8);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void estucheCamara(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 9);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    @Override
    public void marcoFotografia(int cantidad, double precio) {
        producto = new Inventario();
        fsql.rollback(producto, 10);
        cdx = new Cardex(producto);
        cdx.esCompra(true);
        cdx.setCantidad(cantidad);
        cdx.setCosto(precio);
        cdx.setMonto();
        cdx.setFecha(new Date());
        cdx.setPeriodo(periodo);
        mercaderias(cdx.getMonto());
        fsql.commit(cdx);
    }

    /**
     * Registrar el IVA acreditable de una compra
     * <table border="1">
     *   <tr>
     *     <th>Código</th>
     *     <th>Nombre</th>
     *     <th>Debe</th>
     *     <th>Haber</th>
     *   </tr>
     *   <tr>
     *     <td>151-002-002-000</td>
     *     <td>IVA CREDITO FISCAL</td>
     *     <td>valor</td>
     *     <td></td>
     *   </tr>
     * </table>
     * @param valor El valor con que se afectará las cuentas
     * @param cuenta La otra cuenta que afecta
     */
    protected abstract void ivaAcreditable(Cuenta cuenta, double valor);

    /**
     * Registrar el valor de una compra
     *
     * @param codInv El código del inventario
     * @param valor El valor con que se afectará las cuentas
     */
    protected abstract void registrarCompra(String codInv, double valor);
}
